package com.king.config;

import com.google.gson.Gson;
import com.king.utils.PropertiesLoader;
import com.king.utils.StringUtils;
import org.springframework.core.io.DefaultResourceLoader;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

public class GlobalConst {
    //单例模式：懒汉式实现↓↓↓
    //1.私有化 类的构造器
    private GlobalConst() {
    }

    //2.声明当前类对象实例，没有初始化，且为static
    private static GlobalConst globalConst = null;

    //3.声明public static返回当前类对象实例的方法
    /**
     * 获取当前对象实例 多线程安全单例模式(使用双重同步锁)
     *
     * @return
     */
    public static synchronized GlobalConst getInstance() {
        if (globalConst == null) {
            synchronized (GlobalConst.class) {
                if (globalConst == null) {
                    globalConst = new GlobalConst();
                }
            }
        }
        return globalConst;
    }

    /**
     * json工具类
     */
    public static Gson gson = new Gson();

    /**
     * 保存全局属性值
     */
    private static Map<String, String> map = new HashMap<>();

    private static PropertiesLoader loader = new PropertiesLoader("config.properties");

    /**
     * 获取配置
     *
     * @param key
     * @return
     * @see ${fns:getConfig('adminPath')}
     */
    public static String getConfig(String key) {
        String value = map.get(key);
        if (value == null) {
            value = loader.getString(key);
            map.put(key, value != null ? value : StringUtils.EMPTY);
        }
        return value;
    }

    /**
     * 获取工程路径
     *
     * @return
     */
    public static String getProjectPath() {
        // 如果配置了工程路径，则直接返回，否则自动获取。
        String projectPath = getConfig("projectPath");
        if (StringUtils.isNotBlank(projectPath)) {
            return projectPath;
        }
        try {
            File file = new DefaultResourceLoader().getResource("").getFile();
            if (file != null) {
                while (true) {
                    File f = new File(file.getPath() + File.separator + "src" + File.separator + "main");
                    if (f == null || f.exists()) {
                        break;
                    }
                    if (file.getParentFile() != null) {
                        file = file.getParentFile();
                    } else {
                        break;
                    }
                }
                projectPath = file.toString();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return projectPath;
    }
}
